#ifndef PW_PBL_DEFER_HPP
#define PW_PBL_DEFER_HPP

#include <concepts>

namespace pw_pbl
{
	/// 延迟执行动作，实际为超出范围析构时执行
	/// @note 通常不可复制和移动，如果需要可移动需要是Option类型
	template <typename F>
	class defer;

	template <typename F>
	defer(F) -> defer<F>;

	template <std::invocable<> F>
	class defer<F>
	{
		F obj;

	public:
		constexpr defer(F f) : obj{std::move(f)} {}
		constexpr ~defer() { std::move(obj)(); }
		defer(const defer &) = delete;
		defer(defer &&) = delete;
	};

} // namespace pw_pbl

#endif // PW_PBL_DEFER_HPP
